package com.dc.project.util.reader;

import com.dc.project.util.reader.base.BaseReaderUtil;
import com.dc.project.util.reader.base.FileReaderModel;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

/**
 * TxtReaderUtil
 *
 * @author chenxueli
 * @date 2025-03-10 15:46:00
 */
@Slf4j
public class TxtReaderUtil implements BaseReaderUtil {

    /**
     * 读取文件内容
     *
     * @param file 文件
     * @return 文件内容
     */
    @Override
    public FileReaderModel read(File file) {
        try {
            // 首先尝试使用UTF-8读取
            String content = Files.readString(file.toPath(), StandardCharsets.UTF_8);
            if (!containsGarbledText(content)) {
                return FileReaderModel.newInstance(content);
            }
            // 如果出现乱码，尝试使用GBK读取
            content = Files.readString(file.toPath(), StandardCharsets.ISO_8859_1);
            return FileReaderModel.newInstance(new String(content.getBytes(StandardCharsets.ISO_8859_1), "GBK"));
        } catch (Exception e) {
            log.error("读取TXT文件失败：{}", file.getName(), e);
            return FileReaderModel.EMPTY;
        }
    }

    /**
     * 检查文本是否包含乱码
     * 简单判断：如果包含很多特殊字符，认为是乱码
     *
     * @param text 待检查的文本
     * @return 是否包含乱码
     */
    private static boolean containsGarbledText(String text) {
        if (text == null || text.isEmpty()) {
            return false;
        }
        int garbledCount = 0;
        int totalChars = text.length();
        for (char c : text.toCharArray()) {
            if (Character.isIdentifierIgnorable(c) || c >= 0xFFF0 || Character.isSurrogate(c)) {
                garbledCount++;
            }
        }
        // 如果特殊字符占比超过20%，认为是乱码
        return (double) garbledCount / totalChars > 0.2;
    }

}
